package kr.co.bettersoft.carrotmemberstore.activity;
/**
 * MainActivityNotice
 * 메인 탭 - 공지사항 화면.
 * 
 * 웹뷰를 이용하여 공지사항 URL 을 호출하여 보여줌.
 * 
 */

import org.apache.http.util.EncodingUtils;

import kr.co.bettersoft.carrotmemberstore.R;
import kr.co.bettersoft.carrotmemberstore.common.CommonConstant;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivityNotice extends Activity {

	String TAG = "MainActivityNotice";
	
	WebView noticeWebView;

	String loadingURL = (CommonConstant.domain).concat("/mMerchantNoticeBoardList.do");  			 
	String postData = "";

	String merchantId;

	// 진행바
	ProgressBar pb1;		// 중단 로딩 진행바

	String countryCode;
	String languageCode;
	

	Boolean nowLoading = false;			// 공지 가져오는 중에 재 요청 안하도록
	Boolean webPageLoaded = false;		// 공지 갱신없이 한번만 통신하도록 
	Boolean connected;	// 통신상태


	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.main_activity_notice_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.main_activity_notice_progressbar1);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(MainActivityNotice.this, getString(R.string.failed_to_open_page), Toast.LENGTH_SHORT).show();
					// 페이지를 불러오는데 실패했습니다.\n잠시후 다시 시도해주시기 바랍니다.	

				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.w(TAG,"onCreate");
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.main_activity_notice);
		noticeWebView = (WebView) findViewById(R.id.notice_webview);


		// 이미지 확대/축소/스크롤...
		//		registerWebView().setUseWideViewPort(true);		
		noticeWebView.setWebViewClient(new MyWebViewClient());
		noticeWebView.setWebChromeClient(new MyWebChromeClient());  // MyWebChromeClient 지정         -- javascript 사용 됨. 
		noticeWebView.addJavascriptInterface(new AndroidBridge(), "hybrid");
		WebSettings webSet = noticeWebView.getSettings();
		// JavaScript 허용.
		webSet.setJavaScriptEnabled(true);
		// 확대/축소 금지. - 웹에서 차단함.
		//		webSet.setSupportZoom(true);
		//		webSet.setBuiltInZoomControls(true);
	}
	@Override
	public void onResume(){
		super.onResume();
		
		merchantId = MainTabsPage.merchantId;
		
		countryCode = MainTabsPage.countryCode;
		languageCode = MainTabsPage.languageCode;
//		if(CheckNetwork()){
			Log.d(TAG,"webPageLoaded:"+webPageLoaded+"//nowLoading:"+nowLoading);
			
//			loggingToServer();		// *** 보류
			
			// *** 보류에 따라 작성된 코드. 나중에 서버 로깅되면 주석처리할것.
			if(!webPageLoaded && !nowLoading){
				nowLoading = true;
				//				new backgroundNotice().execute();		// 비동기로 URL 오픈 실행
				// 웹뷰는 비동기로하지 않고 바로 한다
//				postData = "Merchant-Language="+strLanguage+"&Merchant-Country="+strCountry;				// 파라미터 : Merchant-Language / Merchant-Country
				postData = "Merchant-Language="+languageCode+"&Merchant-Country="+countryCode;				// 파라미터 : Merchant-Language / Merchant-Country
				noticeWebView.postUrl(loadingURL, EncodingUtils.getBytes(postData, "BASE64"));
				noticeWebView.getSettings().setJavaScriptEnabled(true);
			}
//		}
	}

	/**
	 * Bridge Class
	 * 웹페이지로부터 요청을 받아서 처리한다.
	 */
	private class AndroidBridge {
		// 액티비티 종료
		/**
		 * finishActivity
		 * 액티비티 종료한다
		 *
		 * @param 
		 * @param 
		 * @return 
		 */
		public void finishActivity() {
			handler.post(new Runnable() {
				public void run() {
					finish();
				}
			});
		}
	}

	//	@Override 
	//    public boolean onKeyDown(int keyCode, KeyEvent event) { 			// 뒤로가기 키. --> 제자리를 맴돌기 때문에 사용하지 않는다. 
	//        if ((keyCode == KeyEvent.KEYCODE_BACK) && noticeWebView.canGoBack()) { 
	//        	noticeWebView.goBack(); 
	//            return true; 
	//        } 
	//        return super.onKeyDown(keyCode, event); 
	//    }
	/**
	 * MyWebViewClient
	 * 페이지 로드, 완료 이벤트발생 가능한 웹뷰 클라이언트
	 *
	 */
	private class MyWebViewClient extends WebViewClient {
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}
		/**
		 * onPageFinished
		 *  로딩 끝나면 프로그래스바 숨기고 재로딩 가능상태로 바꾼다.
		 *
		 * @param view
		 * @param url
		 * @return
		 */
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			hidePb();
			webPageLoaded = true;
			nowLoading = false;
		}
		/**
		 * onPageStarted
		 *  웹페이지 로딩시작하면 시간 재서 늦으면 멈춘다.
		 *
		 * @param view
		 * @param url
		 * @param favicon
		 * @return
		 */
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			showPb();
			new Thread(new Runnable() {
				@Override
				public void run() {
					//	            	sleepCounter = sleepCounter +1;
					try {
						Thread.sleep(CommonConstant.webPageLoadingMaxTime);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}finally{
						runOnUiThread(new Runnable(){
							public void run(){
								//	        					if(sleepCounter<2){
									if(noticeWebView.getProgress()<100 && !webPageLoaded) {
										// do what you want
										noticeWebView.stopLoading();
										hidePb();
										showErrMsg();
										webPageLoaded = false;
									}
									//	        					}else{
									//	        						sleepCounter = sleepCounter - 1;
									//	        					}
							}
						});
						nowLoading = false;
					}
				}
			}).start();
		}
	}
	/**
	 * MyWebChromeClient
	 *  자바스크립트 alert 사용 위한 크롬 클라이언트이다
	 *
	 */
	private class MyWebChromeClient extends WebChromeClient {
		//Javascript alert 실행 가능함
		@Override
		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
			final JsResult finalRes = result;
			//AlertDialog 생성
			new AlertDialog.Builder(view.getContext())
			.setMessage(message)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					finalRes.confirm(); 
				}
			})
			.setCancelable(false)
			.create()
			.show();
			return true;
		}
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showErrMsg
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showErrMsg(){			// 화면에 error 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 

//	/*
//	 * 네트워크 상태 감지
//	 * 
//	 */
//	/**
//	 * CheckNetwork
//	 *  네트워크 상태 감지한다
//	 *
//	 * @param
//	 * @param
//	 * @return connected
//	 */
//	public Boolean CheckNetwork(){
//		ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//		NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//		boolean isWifiAvailable = ni.isAvailable();
//		boolean isWifiConn = ni.isConnected();
//		ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
//		boolean isMobileAvail = ni.isAvailable();
//		boolean isMobileConn = ni.isConnected();
//
//		String status = "WiFi Avail="+isWifiAvailable+"//Conn="+isWifiConn
//		+"//Mobile Avail="+isMobileAvail
//		+"//Conn="+isMobileConn;
//		if(!(isWifiConn||isMobileConn)){
//			Log.w(TAG,status);
//			//			AlertShow_networkErr();
//			new Thread( 
//					new Runnable(){
//						public void run(){
//							Message message = handler .obtainMessage();
//							Bundle b = new Bundle();
//							b.putInt( "showNetErrToast" , 1);
//							message.setData(b);
//							handler .sendMessage(message);
//						}
//					}
//			).start();
//			hidePb();
//			connected = false;
//		}else{
//			connected = true;
//		}
//		return connected;
//	}

	// 종료 확인
	/**
	 * onBackPressed
	 *  종료 확인한다
	 *
	 * @param
	 * @param
	 * @return 
	 */
	@Override
	public void onBackPressed() {			// 
		new AlertDialog.Builder(this)
		.setMessage(getString(R.string.confirm_logout))				//  로그아웃 하시겠습니까?  Are you sure you want to Logout?
		.setCancelable(false)
		.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {		// Yes
			public void onClick(DialogInterface dialog, int id) {
				MainActivityNotice.this.finish();
			}
		})
		.setNegativeButton(getString(R.string.no), null)			// No
		.show();
	}

	/**
	 * onPause
	 *  웹페이지 재로드 가능하게 한다
	 *
	 * @param
	 * @param
	 * @return 
	 */
	@Override
	public void onPause(){
		webPageLoaded = false;
		super.onPause();
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	// 서버에 로깅하기.
//	/**
//	 * 서버에 위치 및 로그 남김
//	 * loggingToServer
//	 */
//	public void loggingToServer(){
//					new backgroundUpdateLogToServer().execute();	// 비동기로 전환	
//	}
//	/**
//	 * 비동기로 사용자의 위치 정보 및 정보 로깅
//	 * backgroundUpdateLogToServer
//	 */
//	public class backgroundUpdateLogToServer extends  AsyncTask<Void, Void, Void> { 
//		@Override protected void onPostExecute(Void result) {  
//		} 
//		@Override protected void onPreExecute() {  
//		} 
//		@Override protected Void doInBackground(Void... params) {  
//			Log.d(TAG,"backgroundUpdateMyLocationtoServer");
//			updateLogToServer();
//			return null; 
//		}
//	}
//	/**
//	 * 사용자 위치 정보 및 정보 로깅
//	 * 
//	 */
//	public void updateLogToServer(){
//		if(isUpdating==0){
//			isUpdating = 1;
//			Log.i(TAG, "updateLocationToServer");
//			controllerName = "checkMileageLogController";
//			methodName = "registerLog";
//					
//			new Thread(
//					new Runnable(){
//						public void run(){
//							JSONObject obj = new JSONObject();
//							try{
//								// 자신의 아이디를 넣어서 조회
//								Date today = new Date();
//								SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//								String nowDate = sf.format(today);
//								obj.put("checkMileageId", "");	// checkMileageId 	사용자 아이디
//								obj.put("merchantId", merchantId);		// merchantId		가맹점 아이디.
//								// CheckMileageMerchantAmassView CheckMileageMerchantCheckView // 적립, 차감
//								// CheckMileageMerchantAnnouncementView // CheckMileageMerchantMileageCustomerListView // 공지, 목록
//								// CheckMileageMerchantPreferenceView	// 설정
//								obj.put("viewName", "CheckMileageMerchantAnnouncementView");		// viewName			출력된 화면.
//								obj.put("parameter01", "");		// parameter01		사용자 전화번호.
//								obj.put("parameter02", "");		// parameter02		위도.
//								obj.put("parameter03", "");		// parameter03		경도.
//								obj.put("parameter04", "");		// parameter04		검색일 경우 검색어.
//								obj.put("parameter05", "");		// parameter05		예비용도.
//								obj.put("parameter06", "");		// parameter06		예비용도.
//								obj.put("parameter07", "");		// parameter07		예비용도.
//								obj.put("parameter08", "");		// parameter08		예비용도.
//								obj.put("parameter09", "");		// parameter09		예비용도.
//								obj.put("parameter10", "");		// parameter10		예비용도.
//								obj.put("registerDate", nowDate);		// registerDate		등록 일자.
//							}catch(Exception e){
//								e.printStackTrace();
//							}
//							String jsonString = "{\"checkMileageLog\":" + obj.toString() + "}";
//							try{
//								postUrl2 = new URL(serverName+"/"+controllerName+"/"+methodName);
//								connection2 = (HttpURLConnection) postUrl2.openConnection();
//								connection2.setConnectTimeout(CommonConstant.serverConnectTimeOut);
//								connection2.setDoOutput(true);
//								connection2.setInstanceFollowRedirects(false);
//								connection2.setRequestMethod("POST");
//								connection2.setRequestProperty("Content-Type", "application/json");
//								//								connection2.connect();
//								Thread.sleep(200);
//								OutputStream os2 = connection2.getOutputStream();
//								os2.write(jsonString.getBytes("UTF-8"));
//								os2.flush();
//								Thread.sleep(200);
//								responseCode = connection2.getResponseCode();
//								// 조회한 결과를 처리.
//								if(responseCode==200 || responseCode==204){
//									Log.d(TAG,"updateLogToServer S");
//								}else{
//									Log.d(TAG,"updateLogToServer F / "+responseCode);
//								}
//							}catch(Exception e){ 
//								Log.d(TAG,"updateLocationToServer->fail");
//							}finally{
//								isUpdating = 0;
//								
//								if(!webPageLoaded && !nowLoading){
//									nowLoading = true;
//									//				new backgroundNotice().execute();		// 비동기로 URL 오픈 실행
//									// 웹뷰는 비동기로하지 않고 바로 한다
////									postData = "Merchant-Language="+strLanguage+"&Merchant-Country="+strCountry;				// 파라미터 : Merchant-Language / Merchant-Country
//									postData = "Merchant-Language="+languageCode+"&Merchant-Country="+countryCode;				// 파라미터 : Merchant-Language / Merchant-Country
//									noticeWebView.postUrl(loadingURL, EncodingUtils.getBytes(postData, "BASE64"));
//									noticeWebView.getSettings().setJavaScriptEnabled(true);
//								}
//							}
//						}
//					}
//			).start();
//		}else{
//			Log.w(TAG,"already updating..");
//		}
//	}
}
